"""
配置管理模块
用于管理RAG系统的所有配置参数

作者：RAG学习项目
"""

import os
from typing import Dict, Any

class Config:
    """
    配置类：统一管理所有系统配置
    
    这个类使用单例模式，确保整个应用程序使用相同的配置
    配置优先级：环境变量 > 默认值
    """
    
    def __init__(self):
        """初始化配置"""
        # ollama服务器配置
        self.OLLAMA_HOST = '10.10.22.47' #os.getenv('OLLAMA_HOST', '10.10.22.47')
        self.OLLAMA_PORT = int(os.getenv('OLLAMA_PORT', '11434'))
        self.OLLAMA_MODEL = os.getenv('OLLAMA_MODEL', 'deepseek-r1:14b')
        
        # 文件路径配置
        self.PDF_PATH = os.getenv('PDF_PATH', 'data/weng_page401-409.pdf')
        self.VECTOR_DB_PATH = os.getenv('VECTOR_DB_PATH', 'vector_db')
        self.LOG_PATH = os.getenv('LOG_PATH', 'logs')
        
        # 文本处理配置
        self.CHUNK_SIZE = int(os.getenv('CHUNK_SIZE', '100'))  # 每个文本块的字符数
        self.CHUNK_OVERLAP = int(os.getenv('CHUNK_OVERLAP', '20'))  # 文本块之间的重叠字符数
        
        # 检索配置
        self.TOP_K = int(os.getenv('TOP_K', '5'))  # 检索返回的最相关文档数量
        self.SIMILARITY_THRESHOLD = float(os.getenv('SIMILARITY_THRESHOLD', '0.05'))  # 相似度阈值
        
        # 日志配置
        self.LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO')
        
        # Web应用配置
        self.APP_PORT = int(os.getenv('APP_PORT', '8501'))
        self.APP_HOST = os.getenv('APP_HOST', 'localhost')
    
    def get_ollama_url(self) -> str:
        """
        获取完整的ollama服务器URL
        
        Returns:
            str: 完整的ollama服务器地址
        """
        return f"http://{self.OLLAMA_HOST}:{self.OLLAMA_PORT}"
    
    def get_config_dict(self) -> Dict[str, Any]:
        """
        获取所有配置的字典形式
        
        Returns:
            Dict[str, Any]: 包含所有配置的字典
        """
        return {
            'ollama_host': self.OLLAMA_HOST,
            'ollama_port': self.OLLAMA_PORT,
            'ollama_model': self.OLLAMA_MODEL,
            'pdf_path': self.PDF_PATH,
            'vector_db_path': self.VECTOR_DB_PATH,
            'chunk_size': self.CHUNK_SIZE,
            'chunk_overlap': self.CHUNK_OVERLAP,
            'top_k': self.TOP_K,
            'similarity_threshold': self.SIMILARITY_THRESHOLD,
            'log_level': self.LOG_LEVEL
        }
    
    def validate_config(self) -> bool:
        """
        验证配置的有效性
        
        Returns:
            bool: 配置是否有效
        
        Raises:
            ValueError: 当配置无效时抛出异常
        """
        # 检查必要的文件是否存在
        if not os.path.exists(self.PDF_PATH):
            raise ValueError(f"PDF文件不存在: {self.PDF_PATH}")
        
        # 检查端口号是否有效
        if not (1 <= self.OLLAMA_PORT <= 65535):
            raise ValueError(f"无效的端口号: {self.OLLAMA_PORT}")
        
        # 检查文本块大小是否合理
        if self.CHUNK_SIZE <= 0:
            raise ValueError(f"文本块大小必须大于0: {self.CHUNK_SIZE}")
        
        if self.CHUNK_OVERLAP >= self.CHUNK_SIZE:
            raise ValueError(f"重叠大小不能大于等于文本块大小: {self.CHUNK_OVERLAP} >= {self.CHUNK_SIZE}")
        
        return True

# 创建全局配置实例
# 这样整个应用程序都可以通过 from src.config import config 来使用配置
config = Config()

# 如果直接运行此文件，则显示当前配置
if __name__ == "__main__":
    print("=== RAG系统配置信息 ===")
    print(f"ollama服务器: {config.get_ollama_url()}")
    print(f"使用模型: {config.OLLAMA_MODEL}")
    print(f"PDF文件路径: {config.PDF_PATH}")
    print(f"向量数据库路径: {config.VECTOR_DB_PATH}")
    print(f"文本块大小: {config.CHUNK_SIZE}")
    print(f"文本块重叠: {config.CHUNK_OVERLAP}")
    print(f"检索数量: {config.TOP_K}")
    print(f"相似度阈值: {config.SIMILARITY_THRESHOLD}")
    
    # 验证配置
    try:
        config.validate_config()
        print("✅ 配置验证通过")
    except ValueError as e:
        print(f"❌ 配置验证失败: {e}") 